home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 36 / Amiga Format CD36 (1999-01-22)(Future Publishing)(GB)[!][issue 1999-02].iso / -seriously_amiga- / graphics / gfx3d.library / examples / moto.e < prev   
Text File  |  1998-12-12  |  12KB  |  533 lines

  1.  
  2. MODULE  'gfx3d',
  3.         'libraries/gfx3d'
  4.  
  5. MODULE  'exec/memory',
  6.         'graphics/gfx',
  7.         'graphics/view',
  8.         'intuition/screens'
  9.  
  10.  
  11.  
  12. CONST WIDTH =  320,
  13.       HEIGHT = 200
  14.  
  15.  
  16.  
  17. PROC main ()
  18.   DEF raster : LONG
  19.   DEF bitmap : PTR TO bitmap
  20.   DEF newscreen : PTR TO ns
  21.   DEF screen : PTR TO screen
  22.   DEF env, camera : LONG
  23.   DEF moto : LONG
  24.   DEF i, k : LONG
  25.   DEF points, polygons : PTR TO INT
  26.   DEF startsec, startmic : LONG
  27.   DEF seconds, micros : LONG
  28.   DEF view : PTR TO view
  29.   DEF viewport : PTR TO viewport
  30.   DEF joy : REG
  31.   DEF x, y, v, vmax, a, d, ac, dec : LONG
  32.   DEF sn, cs : LONG
  33.   DEF piega, maxp, treshp : LONG
  34.   DEF fps : LONG
  35.  
  36.   newscreen := [ 0 , 0 ,
  37.                  WIDTH , HEIGHT ,
  38.                  8 ,
  39.                  0 , 1 ,
  40.                  0 ,
  41.                  CUSTOMSCREEN OR CUSTOMBITMAP ,
  42.                  0 ,
  43.                  'E screen...' ,
  44.                  0 , 0 ] : ns
  45.  
  46.   points := [
  47. -4, 6, -4,
  48. -4, 9, -5,
  49. -4, 7, -17,
  50. -4, 6, -17,
  51. 0, 4, -9,
  52. 0, 0, -13,
  53. 0, 0, -19,
  54. 0, 4, -23,
  55. 0, 10, -23,
  56. 0, 14, -19,
  57. 0, 14, -13,
  58. 0, 10, -9,
  59. -3, 13, -14,
  60. 0, 11, -14,
  61. 3, 13, -14,
  62. -3, 13, -18,
  63. 0, 11, -18,
  64. 3, 13, -18,
  65. -3, 9, -22,
  66. 0, 9, -20,
  67. 3, 9, -22,
  68. -3, 5, -22,
  69. 0, 5, -20,
  70. 3, 5, -22,
  71. -3, 1, -18,
  72. 0, 3, -18,
  73. 3, 1, -18,
  74. -3, 1, -14,
  75. 0, 3, -14,
  76. 3, 1, -14,
  77. -3, 5, -10,
  78. -3, 9, -10,
  79. 0, 5, -12,
  80. 3, 5, -10,
  81. 3, 9, -10,
  82. 0, 9, -12,
  83. 0, 5, 21,
  84. 0, 3, 19,
  85. 0, 3, 15,
  86. 0, 5, 13,
  87. 0, 9, 13,
  88. 0, 11, 15,
  89. 0, 9, 21,
  90. 0, 11, 19,
  91. -2, 13, 19,
  92. 2, 13, 19,
  93. 0, 14, 20,
  94. -2, 13, 15,
  95. 2, 13, 15,
  96. 0, 14, 14,
  97. -2, 9, 11,
  98. 2, 9, 11,
  99. 0, 10, 10,
  100. -2, 5, 11,
  101. 2, 5, 11,
  102. 0, 4, 10,
  103. -2, 1, 15,
  104. 2, 1, 15,
  105. 0, 0, 14,
  106. -2, 1, 19,
  107. 2, 1, 19,
  108. 0, 0, 20,
  109. -2, 5, 23,
  110. -2, 9, 23,
  111. 2, 9, 23,
  112. 2, 5, 23,
  113. 0, 4, 24,
  114. 0, 10, 24,
  115. 2, 19, -23,
  116. -2, 19, -23,
  117. 1, 21, -25,
  118. -1, 21, -25,
  119. 3, 17, -15,
  120. -3, 17, -15,
  121. 4, 19, -16,
  122. 2, 22, -16,
  123. -2, 22, -16,
  124. -4, 19, -16,
  125. 3, 12, -5,
  126. 2, 15, -7,
  127. -3, 12, -5,
  128. -2, 15, -7,
  129. 4, 20, 8,
  130. 3, 21, -4,
  131. 3, 15, 0,
  132. 0, 17, -7,
  133. 5, 11, -2,
  134. -5, 11, -2,
  135. -3, 15, 0,
  136. -4, 20, 8,
  137. -3, 21, -4,
  138. 0, 2, -8,
  139. 0, 2, 10,
  140. -5, 6, 0,
  141. -4, 8, 10,
  142. -5, 16, 15,
  143. -5, 18, 7,
  144. 0, 18, 20,
  145. -6, 19, 16,
  146. -4, 24, 18,
  147. -3, 28, 12,
  148. -6, 27, 8,
  149. 6, 19, 16,
  150. 5, 18, 7,
  151. 5, 6, 0,
  152. 4, 6, -4,
  153. 4, 8, 10,
  154. 5, 16, 15,
  155. 4, 24, 18,
  156. 3, 28, 12,
  157. 6, 27, 8 ] : INT
  158.  
  159.   polygons := [ 143,
  160. 4, 3, 2, 1, 0, 15,
  161. 4, 3, 0, 1, 2, 15,
  162. 4, 11, 4, 33, 34, 5,
  163. 4, 31, 30, 4, 11, 5,
  164. 4, 4, 5, 29, 33, 5,
  165. 4, 30, 27, 5, 4, 5,
  166. 4, 5, 6, 26, 29, 5,
  167. 4, 27, 24, 6, 5, 5,
  168. 4, 6, 7, 23, 26, 5,
  169. 4, 24, 21, 7, 6, 5,
  170. 4, 7, 8, 20, 23, 5,
  171. 4, 21, 18, 8, 7, 5,
  172. 4, 8, 9, 17, 20, 5,
  173. 4, 18, 15, 9, 8, 5,
  174. 4, 9, 10, 14, 17, 5,
  175. 4, 15, 12, 10, 9, 5,
  176. 4, 10, 11, 34, 14, 5,
  177. 4, 12, 31, 11, 10, 5,
  178. 4, 12, 13, 35, 31, 10,
  179. 4, 13, 14, 34, 35, 10,
  180. 4, 15, 16, 13, 12, 10,
  181. 4, 16, 17, 14, 13, 10,
  182. 4, 18, 19, 16, 15, 10,
  183. 4, 19, 20, 17, 16, 10,
  184. 4, 21, 22, 19, 18, 10,
  185. 4, 22, 23, 20, 19, 10,
  186. 4, 24, 25, 22, 21, 10,
  187. 4, 25, 26, 23, 22, 10,
  188. 4, 27, 28, 25, 24, 10,
  189. 4, 28, 29, 26, 25, 10,
  190. 4, 30, 32, 28, 27, 10,
  191. 4, 32, 33, 29, 28, 10,
  192. 4, 31, 35, 32, 30, 10,
  193. 4, 35, 34, 33, 32, 10,
  194. 4, 42, 64, 65, 36, 10,
  195. 4, 63, 42, 36, 62, 10,
  196. 4, 36, 65, 60, 37, 10,
  197. 4, 62, 36, 37, 59, 10,
  198. 4, 37, 60, 57, 38, 10,
  199. 4, 59, 37, 38, 56, 10,
  200. 4, 38, 57, 54, 39, 10,
  201. 4, 56, 38, 39, 53, 10,
  202. 4, 39, 54, 51, 40, 10,
  203. 4, 53, 39, 40, 50, 10,
  204. 4, 40, 51, 48, 41, 10,
  205. 4, 50, 40, 41, 47, 10,
  206. 4, 41, 48, 45, 43, 10,
  207. 4, 47, 41, 43, 44, 10,
  208. 4, 43, 45, 64, 42, 10,
  209. 4, 44, 43, 42, 63, 10,
  210. 4, 44, 63, 67, 46, 5,
  211. 4, 46, 67, 64, 45, 5,
  212. 4, 47, 44, 46, 49, 5,
  213. 4, 49, 46, 45, 48, 5,
  214. 4, 50, 47, 49, 52, 5,
  215. 4, 52, 49, 48, 51, 5,
  216. 4, 53, 50, 52, 55, 5,
  217. 4, 55, 52, 51, 54, 5,
  218. 4, 56, 53, 55, 58, 5,
  219. 4, 58, 55, 54, 57, 5,
  220. 4, 59, 56, 58, 61, 5,
  221. 4, 61, 58, 57, 60, 5,
  222. 4, 62, 59, 61, 66, 5,
  223. 4, 66, 61, 60, 65, 5,
  224. 4, 63, 62, 66, 67, 5,
  225. 4, 67, 66, 65, 64, 5,
  226. 4, 80, 78, 105, 0, 7,
  227. 3, 0, 105, 91, 7,
  228. 3, 104, 78, 86, 15,
  229. 3, 105, 78, 104, 15,
  230. 3, 80, 93, 87, 15,
  231. 3, 0, 93, 80, 15,
  232. 4, 80, 81, 79, 78, 7,
  233. 4, 89, 98, 102, 82, 7,
  234. 4, 102, 98, 99, 108, 7,
  235. 3, 102, 110, 108, 12,
  236. 3, 98, 99, 101, 12,
  237. 3, 110, 109, 108, 9,
  238. 4, 99, 108, 109, 100, 9,
  239. 3, 101, 99, 100, 9,
  240. 3, 78, 86, 104, 15,
  241. 3, 80, 93, 87, 15,
  242. 3, 103, 82, 102, 15,
  243. 3, 96, 98, 89, 15,
  244. 3, 84, 82, 103, 15,
  245. 3, 88, 96, 89, 15,
  246. 3, 84, 103, 86, 15,
  247. 3, 87, 96, 88, 15,
  248. 3, 78, 84, 86, 15,
  249. 3, 80, 87, 88, 15,
  250. 4, 73, 72, 79, 81, 14,
  251. 4, 69, 68, 72, 73, 14,
  252. 4, 71, 70, 68, 69, 12,
  253. 3, 68, 74, 72, 14,
  254. 3, 69, 73, 77, 14,
  255. 3, 75, 74, 68, 12,
  256. 3, 69, 77, 76, 12,
  257. 3, 70, 75, 68, 12,
  258. 3, 71, 69, 76, 12,
  259. 4, 76, 75, 70, 71, 12,
  260. 4, 76, 77, 74, 75, 12,
  261. 3, 73, 81, 77, 5,
  262. 3, 72, 74, 79, 5,
  263. 3, 85, 74, 77, 5,
  264. 3, 79, 74, 85, 5,
  265. 3, 81, 85, 77, 5,
  266. 3, 79, 85, 84, 14,
  267. 3, 79, 84, 78, 14,
  268. 3, 81, 88, 85, 14,
  269. 3, 81, 80, 88, 14,
  270. 3, 84, 83, 82, 12,
  271. 3, 84, 85, 83, 12,
  272. 3, 90, 88, 89, 12,
  273. 3, 85, 88, 90, 12,
  274. 4, 89, 82, 83, 90, 12,
  275. 3, 85, 90, 83, 12,
  276. 3, 104, 92, 91, 14,
  277. 3, 91, 92, 93, 14,
  278. 3, 91, 105, 104, 14,
  279. 3, 91, 93, 0, 14,
  280. 3, 86, 103, 104, 12,
  281. 3, 87, 93, 96, 12,
  282. 4, 106, 107, 95, 94, 5,
  283. 3, 92, 106, 94, 5,
  284. 3, 107, 97, 95, 14,
  285. 3, 107, 106, 104, 12,
  286. 3, 107, 104, 103, 12,
  287. 3, 93, 95, 96, 12,
  288. 3, 93, 94, 95, 12,
  289. 3, 92, 104, 106, 12,
  290. 3, 107, 102, 97, 14,
  291. 3, 103, 102, 107, 14,
  292. 3, 97, 102, 108, 12,
  293. 3, 102, 108, 110, 12,
  294. 3, 110, 108, 109, 9,
  295. 3, 101, 100, 99, 9,
  296. 3, 98, 101, 99, 12,
  297. 3, 97, 99, 98, 12,
  298. 3, 96, 95, 98, 14,
  299. 3, 95, 97, 98, 14,
  300. 3, 92, 94, 93, 12,
  301. 3, 97, 108, 99, 12,
  302. 4, 99, 100, 109, 108, 9 ] : INT
  303.  
  304.   IF gfx3dbase := OpenLibrary ( 'gfx3d.library' , 0 )
  305.     IF raster := AllocMem ( WIDTH*HEIGHT , MEMF_CHIP OR MEMF_CLEAR )
  306.       IF bitmap := AllocMem ( SIZEOF bitmap , MEMF_PUBLIC )
  307.         InitBitMap ( bitmap , 8 , WIDTH , HEIGHT )
  308.         FOR k:=0 TO 7
  309.           bitmap.planes[k] := raster+(k*WIDTH/8*HEIGHT)
  310.         ENDFOR
  311.         newscreen.custombitmap := bitmap
  312.         IF screen := OpenScreen ( newscreen )
  313.  
  314.           view := ViewAddress()
  315.           viewport := view.viewport
  316.           SetRGB4( viewport , 0 , 0 , 0 , 0 )
  317.           SetRGB4( viewport , 5 , 4 , 4 , 4 )
  318.           SetRGB4( viewport , 7 , 12 , 12 , 12 )
  319.           SetRGB4( viewport , 9 , 1 , 14 , 15 )
  320.           SetRGB4( viewport , 10 , 14 , 4 , 1 )
  321.           SetRGB4( viewport , 12 , 5 , 0 , 15 )
  322.           SetRGB4( viewport , 14 , 12 , 8 , 4 )
  323.           SetRGB4( viewport , 15 , 14 , 14 , 14 )
  324.  
  325.           GfXBegin ( GFX_ENVIRONMENT )
  326.             GfXBegin ( GFX_OBJECT )
  327.               GfXFrame ( buildframe ( points , polygons , GfXFlt( 10 ) , 0 ) )
  328.               GfXPosition ( 0 , 512 , 0 )
  329.             moto := GfXEnd ()
  330.             GfXObject ( moto )
  331.           env := GfXEnd ()
  332.  
  333.           GfXBegin ( GFX_CAMERA )
  334.             GfXWidth ( WIDTH )
  335.             GfXHeight ( HEIGHT )
  336.             GfXVideoBuffer ( raster )
  337.             GfXEnvironment ( env )
  338.             GfXFocus ( 256 )
  339.             GfXAspectRatio ( GfXDiv( GfXFlt( 320 ) , GfXFlt( WIDTH ) ) ,
  340.                             GfXFlt( 1 ) ,
  341.                             GfXDiv( GfXFlt( 200 ) , GfXFlt( HEIGHT ) ) )
  342.             GfXPosition( 0 , -100 , 300 )
  343.             GfXDirection ( -10 , 0 , 0 )
  344.           camera := GfXEnd ()
  345.  
  346.           k := 0
  347.           i := 0
  348.           x := 0
  349.           y := 512
  350.           v := 0
  351.           vmax := 200
  352.           piega := 0
  353.           maxp := 32
  354.           treshp := 16
  355.           CurrentTime ( {startsec} , {startmic} )
  356.           fps := 5
  357.           REPEAT
  358.             a := 50 / fps
  359.             d := 50 / fps
  360.             ac := 150 / fps
  361.             dec := 50 / fps
  362.             joy := readjoystick( 1 )
  363.  
  364.             IF joy AND 4
  365.               piega := piega + a
  366.               IF piega > maxp THEN piega := maxp
  367.             ELSE
  368.               IF piega > 0
  369.                 piega := piega - d
  370.                 IF piega < 0 THEN piega := 0
  371.               ENDIF
  372.             ENDIF
  373.  
  374.             IF joy AND 8
  375.               piega := piega - a
  376.               IF piega < (-maxp) THEN piega := -maxp
  377.             ELSE
  378.               IF piega < 0
  379.                 piega := piega + d
  380.                 IF piega > 0 THEN piega := 0
  381.               ENDIF
  382.             ENDIF
  383.  
  384.             IF joy AND 1
  385.               v := v + ac
  386.               IF v > vmax THEN v := vmax
  387.             ENDIF
  388.  
  389.             IF joy AND 2
  390.               v := v - 4
  391.             ENDIF
  392.  
  393.             v := v - dec
  394.             IF v < 0 THEN v := 0
  395.  
  396.             IF ( (v > 0) AND ( ( piega > treshp ) OR ( piega < (-treshp) ) ) ) THEN i := i - ( piega / 3 )
  397.  
  398.             sn := GfXSin( GfXFixMul( i , GfXDiv( GfXFlt( 128 ) , GfXPi() ) ) )
  399.             cs := GfXCos( GfXFixMul( i , GfXDiv( GfXFlt( 128 ) , GfXPi() ) ) )
  400.             x := x - GfXFltMul( sn , v )
  401.             y := y + GfXFltMul( cs , v )
  402.  
  403.             GfXModifyObjectPosition ( moto , x , y , 0 )
  404.             GfXModifyObjectDirection ( moto ,
  405.                                       -GfXFltMul( sn , piega ),
  406.                                       GfXFltMul( cs , piega ),
  407.                                       i )
  408.             GfXUpdateScene ( camera )
  409.             WaitTOF ()
  410.             GfXUpdateVideoBuffer ()
  411.             GfXClearWorkBuffer ()
  412.             INC k
  413.  
  414.             CurrentTime ( {seconds} , {micros} )
  415.             seconds := seconds - startsec
  416.             IF seconds <= 0 THEN seconds := 1
  417.             IF k > seconds
  418.               fps := k / seconds
  419.             ELSE
  420.               fps := 1
  421.             ENDIF
  422.  
  423.           UNTIL readjoystick( 1 ) >= 16
  424.  
  425.           Delay ( 50 )
  426.           CloseScreen ( screen )
  427.         ENDIF
  428.         FreeMem ( bitmap , SIZEOF bitmap )
  429.       ENDIF
  430.       FreeMem ( raster , WIDTH*HEIGHT )
  431.     ENDIF
  432.     CloseLibrary ( gfx3dbase )
  433.   ENDIF
  434. ENDPROC
  435.  
  436.  
  437.  
  438. PROC buildframe ( points : PTR TO INT , polygons : PTR TO INT ,
  439.                   scale : LONG , offset : LONG )
  440.   DEF i, k : LONG
  441.   DEF count : LONG
  442.   DEF n : LONG
  443.   DEF index : LONG
  444.   DEF color : LONG
  445.   DEF x, y, z : LONG
  446.   DEF x0, y0, z0 : LONG
  447.   DEF x1, y1, z1 : LONG
  448.  
  449.   GfXBegin ( GFX_FRAME )
  450.  
  451.     count := polygons[0]
  452.     index := 1
  453.     FOR k:=1 TO count
  454.       n := polygons[ index ]
  455.       INC index
  456.       color := polygons[ index+n ]
  457.       GfXSetColor ( color+offset )
  458.       x0 := GfXFltMul( scale , points[ polygons[ index ] * 3 ] )
  459.       y0 := GfXFltMul( scale , points[ polygons[ index ] * 3 + 1 ] )
  460.       z0 := GfXFltMul( scale , points[ polygons[ index ] * 3 + 2 ] )
  461.       x1 := GfXFltMul( scale , points[ polygons[ index+1 ] * 3 ] )
  462.       y1 := GfXFltMul( scale , points[ polygons[ index+1 ] * 3 + 1 ] )
  463.       z1 := GfXFltMul( scale , points[ polygons[ index+1 ] * 3 + 2 ] )
  464.       i := 2
  465.       WHILE i < n
  466.         GfXBegin ( GFX_POLYGON )
  467.           GfXVertex ( x0 , z0 , y0 )
  468.           x := GfXFltMul( scale , points[ polygons[ index+i ] * 3 ] )
  469.           y := GfXFltMul( scale , points[ polygons[ index+i ] * 3 + 1 ] )
  470.           z := GfXFltMul( scale , points[ polygons[ index+i ] * 3 + 2 ] )
  471.           INC i
  472.           GfXVertex ( x , z , y )
  473.           GfXVertex ( x1 , z1 , y1 )
  474.         GfXPolygon ( GfXEnd () )
  475.         IF i < n
  476.           x1 := x
  477.           y1 := y
  478.           z1 := z
  479.         ENDIF
  480.       ENDWHILE
  481.       index := index+n+1
  482.     ENDFOR
  483.  
  484.   RETURN GfXEnd ()
  485.  
  486. ENDPROC
  487.  
  488. PROC readjoystick ( joynum : LONG )
  489.   DEF ret : REG
  490.   DEF joy : REG
  491.   DEF read : REG
  492.   DEF hardware : PTR TO INT
  493.   DEF leftbutton : PTR TO CHAR
  494.  
  495.   MOVEQ #0,ret
  496.  
  497.   IF joynum=0
  498.     hardware := $DFF00A
  499.   ELSE
  500.     hardware := $DFF00C
  501.   ENDIF
  502.  
  503.   joy := hardware[0]
  504.  
  505.   MOVE.W  joy,read
  506.   LSR.W   #1,read
  507.   EOR.W   joy,read
  508.  
  509.   IF read AND $0100 THEN ret := 1
  510.   IF read AND $0001 THEN ret := ret + 2
  511.   IF joy AND $0002 THEN ret := ret + 4
  512.   IF joy AND $0200 THEN ret := ret + 8
  513.  
  514.   leftbutton := $BFE001
  515.  
  516.   joy := leftbutton[]
  517.  
  518.   NOT.W   joy
  519.  
  520.   IF joynum = 0
  521.     IF joy AND $0040 THEN ret := ret + 16
  522.   ELSE
  523.     IF joy AND $0080 THEN ret := ret + 16
  524.   ENDIF
  525.  
  526. ENDPROC ret
  527.  
  528.  
  529. /*EE folds
  530. -1
  531. 438 47 441 37 
  532. EE folds*/
  533.